/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package fr.cggveritas.crewintranet.jms.managedBeans.migration;

import fr.cggveritas.crewintranet.jms.dao.jpacontroller.CvConfigurationmigrationJpaController;
import fr.cggveritas.crewintranet.jms.dao.jpacontroller.CvDocofficielsJpaController;
import fr.cggveritas.crewintranet.jms.dao.jpacontroller.CvTravailJpaController;
import fr.cggveritas.crewintranet.jms.dao.jpacontroller.CvTravailleurJpaController;
import fr.cggveritas.crewintranet.jms.dao.jpacontroller.CvTypedecontratJpaController;
import fr.cggveritas.crewintranet.jms.dao.jpacontroller.exceptions.PreexistingEntityException;
import fr.cggveritas.crewintranet.jms.entities.CvAffectation;
import fr.cggveritas.crewintranet.jms.entities.CvCompagnie;
import fr.cggveritas.crewintranet.jms.entities.CvConfigurationmigration;
import fr.cggveritas.crewintranet.jms.entities.CvDocofficiels;
import fr.cggveritas.crewintranet.jms.entities.CvPosteoccupe;
import fr.cggveritas.crewintranet.jms.entities.CvTravail;
import fr.cggveritas.crewintranet.jms.entities.CvTravailleur;
import fr.cggveritas.crewintranet.jms.entities.CvTypedecontrat;
import fr.cggveritas.crewintranet.migrationdb.access.ConnexionDBAccess;
import fr.cggveritas.crewintranet.migrationdb.access.ConnexionSGDBMS;
import fr.cggveritas.crewintranet.migrationdb.access.PersonnelDataAccess;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import org.primefaces.event.DragDropEvent;

/**
 *
 * @author Alassane
 */
@ManagedBean(name = "migrationdbaccessBean")
@SessionScoped
public class migrationdbaccessBean implements Serializable {

    /**
     * Creates a new instance of migrationdbaccessBean
     */
    private CvConfigurationmigrationJpaController cvConfigurationmigrationJpaController;
    private CvConfigurationmigration cvConfigurationmigrationAccess;
    private ConnexionDBAccess cvConnexionDBAccess;
    private List<PersonnelDataAccess> personnelDeLaBaseAccess;
    private List<CvTravailleur> personnelDeLaBaseAccessT;
    private List<PersonnelDataAccess> personnelMission;
    private List<CvTravailleur> personnelMissionT;
    private List<PersonnelDataAccess> personnelAffectation;
    private List<CvTravailleur> personnelAffectationT;
    private List<CvTravailleur> personnelPosteT;
    private CvAffectation affecteMission;
    private CvCompagnie affecteCompagnie;
    private CvPosteoccupe cvPosteoccupeNouveau;

    private boolean lancement;
    private boolean complet;
    private Integer progress;

    public migrationdbaccessBean() {
        cvConfigurationmigrationJpaController = new CvConfigurationmigrationJpaController();
        cvConfigurationmigrationAccess = cvConfigurationmigrationJpaController.findCvConfigurationmigration("access");
        cvConnexionDBAccess = new ConnexionDBAccess();
        lancement = false;
        complet = false;
        progress = null;
        personnelDeLaBaseAccess = new ArrayList<PersonnelDataAccess>();
        personnelDeLaBaseAccessT = new ArrayList<CvTravailleur>();
        personnelMission = new ArrayList<PersonnelDataAccess>();
        personnelMissionT = new ArrayList<CvTravailleur>();
        personnelAffectation = new ArrayList<PersonnelDataAccess>();
        personnelAffectationT = new ArrayList<CvTravailleur>();
        personnelPosteT = new ArrayList<CvTravailleur>();
        affecteCompagnie = new CvCompagnie();
        affecteMission = new CvAffectation();
        cvPosteoccupeNouveau = new CvPosteoccupe();
    }

    public void chargerLesPersonneDeLaBase() {
        ConnexionSGDBMS connexionSGDBMSAccess = new ConnexionSGDBMS(
                "jdbc:odbc:" + cvConfigurationmigrationAccess.getSourcededonnee() + ";",
                cvConfigurationmigrationAccess.getUser(),
                cvConfigurationmigrationAccess.getPassword());
        personnelDeLaBaseAccess = cvConnexionDBAccess.getListDesPersonnelDeLaBaseAccess(connexionSGDBMSAccess);

    }

    public CvConfigurationmigrationJpaController getCvConfigurationmigrationJpaController() {
        return cvConfigurationmigrationJpaController;
    }

    public void setCvConfigurationmigrationJpaController(CvConfigurationmigrationJpaController cvConfigurationmigrationJpaController) {
        this.cvConfigurationmigrationJpaController = cvConfigurationmigrationJpaController;
    }

    public CvConfigurationmigration getCvConfigurationmigrationAccess() {
        return cvConfigurationmigrationAccess;
    }

    public void setCvConfigurationmigrationAccess(CvConfigurationmigration cvConfigurationmigrationAccess) {
        this.cvConfigurationmigrationAccess = cvConfigurationmigrationAccess;
    }

    public ConnexionDBAccess getCvConnexionDBAccess() {
        return cvConnexionDBAccess;
    }

    public void setCvConnexionDBAccess(ConnexionDBAccess cvConnexionDBAccess) {
        this.cvConnexionDBAccess = cvConnexionDBAccess;
    }

    public void changeLancement() throws Exception {
        lancement = true;
        chargerLesPersonneDeLaBase();

        personnelDeLaBaseAccessT = migrationDataBaseAccess(personnelDeLaBaseAccess);
        complet = true;
    }

    public Integer getProgress() {
        if (progress == null) {
            progress = 0;
        } else {
            if (lancement) {
                progress = progress + (int) (Math.random() * 35);

                if (progress > 100) {
                    progress = 50;
                } else {
                    if (complet == false) {
                        progress += (int) (100 - progress) / 2;
                    } else {
                        progress = 100;
                    }
                }
            }

        }

        return progress;
    }

    public void onComplete() {
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Progress Completed", "Progress Completed"));
    }

    public void setProgress(Integer progress) {
        this.progress = progress;
    }

    public List<PersonnelDataAccess> getPersonnelDeLaBaseAccess() {

        return personnelDeLaBaseAccess;
    }

    public void setPersonnelDeLaBaseAccess(List<PersonnelDataAccess> personnelDeLaBaseAccess) {
        this.personnelDeLaBaseAccess = personnelDeLaBaseAccess;
    }

    public boolean isLancement() {
        return lancement;
    }

    public void setLancement(boolean lancement) {
        this.lancement = lancement;
    }

    public List<PersonnelDataAccess> getPersonnelMission() {
        return personnelMission;
    }

    public void setPersonnelMission(List<PersonnelDataAccess> personnelMission) {
        this.personnelMission = personnelMission;
    }

    public void onPersonnelDropMission(DragDropEvent ddEvent) {
        PersonnelDataAccess personnelDataAccess = ((PersonnelDataAccess) ddEvent.getData());

        personnelMission.add(personnelDataAccess);
        personnelDeLaBaseAccess.remove(personnelDataAccess);
    }

    public void onPersonnelDropAffectation(DragDropEvent ddEvent) {
        PersonnelDataAccess personnelDataAccess = ((PersonnelDataAccess) ddEvent.getData());

        personnelAffectation.add(personnelDataAccess);
        personnelDeLaBaseAccess.remove(personnelDataAccess);
    }

    public void onPersonnelDropMissionT(DragDropEvent ddEvent) {
        CvTravailleur personnelDataAccess = ((CvTravailleur) ddEvent.getData());
        if (!personnelMissionT.contains(personnelDataAccess)) {
            personnelMissionT.add(personnelDataAccess);
        }else {
            verificationExisteDansLesAutresListe(personnelDataAccess);
        }
    }

    public void onPersonnelDropAffectationT(DragDropEvent ddEvent) {
        CvTravailleur personnelDataAccess = ((CvTravailleur) ddEvent.getData());
        if (!personnelAffectationT.contains(personnelDataAccess)) {
            personnelAffectationT.add(personnelDataAccess);
        }else {
            verificationExisteDansLesAutresListe(personnelDataAccess);
        }
    }

    public void onPersonnelDropPosteT(DragDropEvent ddEvent) {
        CvTravailleur personnelDataAccess = ((CvTravailleur) ddEvent.getData());
        if (!personnelPosteT.contains(personnelDataAccess)) {
            personnelPosteT.add(personnelDataAccess);
        } else {
            verificationExisteDansLesAutresListe(personnelDataAccess);
        }
    }

    public List<PersonnelDataAccess> getPersonnelAffectation() {
        return personnelAffectation;
    }

    public void setPersonnelAffectation(List<PersonnelDataAccess> personnelAffectation) {
        this.personnelAffectation = personnelAffectation;
    }

    public List<CvTravailleur> getPersonnelPosteT() {
        return personnelPosteT;
    }

    public void setPersonnelPosteT(List<CvTravailleur> personnelPosteT) {
        this.personnelPosteT = personnelPosteT;
    }

    public List<CvTravailleur> migrationDataBaseAccess(List<PersonnelDataAccess> pList) throws Exception {
        CvTravailleurJpaController cvTravailleurJpaController = new CvTravailleurJpaController();
        CvDocofficielsJpaController cvDocofficielsJpaController = new CvDocofficielsJpaController();
        CvTravailJpaController cvTravailJpaController = new CvTravailJpaController();
        List<CvTravailleur> reponse = new ArrayList<CvTravailleur>();

        try {
            for (PersonnelDataAccess personnelDataAccess : pList) {

                CvTravailleur cvTravailleur = new CvTravailleur();
                CvDocofficiels cvDocofficiels = new CvDocofficiels();
                CvTravail cvTravail = new CvTravail();
                cvTravailleur.setIDpersonne(Integer.parseInt(personnelDataAccess.getID_PERSONNEL()));
                cvTravailleur.setNom(personnelDataAccess.getNom());
                cvTravailleur.setPrenom(personnelDataAccess.getPrenom());
                cvTravailleur.setDatenaissance(personnelDataAccess.getBirthdate());
                cvTravailleur.setAdressederesidence(personnelDataAccess.getAdresse());
                cvTravailleur.setGroupesangin(personnelDataAccess.getGroupeSanguin());
                cvTravailleur.setFacteurrhesus(personnelDataAccess.getFacteurRhesus());
                cvTravailleur.setImageBlog(personnelDataAccess.getPhoto());
                cvDocofficiels.setNumerocardeidentite(personnelDataAccess.getID_Card());

                CvTravailleur testCvTravailleur = new CvTravailleur();
                testCvTravailleur = cvTravailleurJpaController.findCvTravailleurByIdPersonnel(Integer.parseInt(personnelDataAccess.getID_PERSONNEL()));

                if (testCvTravailleur.getId() == null) {
//                    cvTravailleurJpaController.create(cvTravailleur);
                    List<CvDocofficiels> listCvDocofficielses = new ArrayList<CvDocofficiels>();
                    cvDocofficiels.setCvTravailleurId(cvTravailleur);
                    cvTravail.setCvTravailleur(cvTravailleur);
                    listCvDocofficielses.add(cvDocofficiels);
                    cvTravailleur.setCvDocofficielsList(listCvDocofficielses);

                    reponse.add(cvTravailleur);
                }
            }

            return reponse;
        } catch (Exception e) {
            System.err.println("Exception : " + e.getMessage());
        }
        return reponse;
    }

    public List<CvTravailleur> getPersonnelDeLaBaseAccessT() {
        return personnelDeLaBaseAccessT;
    }

    public void setPersonnelDeLaBaseAccessT(List<CvTravailleur> personnelDeLaBaseAccessT) {
        this.personnelDeLaBaseAccessT = personnelDeLaBaseAccessT;
    }

    public List<CvTravailleur> getPersonnelMissionT() {
        return personnelMissionT;
    }

    public void setPersonnelMissionT(List<CvTravailleur> personnelMissionT) {
        this.personnelMissionT = personnelMissionT;
    }

    public List<CvTravailleur> getPersonnelAffectationT() {
        return personnelAffectationT;
    }

    public void setPersonnelAffectationT(List<CvTravailleur> personnelAffectationT) {
        this.personnelAffectationT = personnelAffectationT;
    }

    public void chargerLesPersonneDeLaBaseVersTravailleur() throws Exception {
        chargerLesPersonneDeLaBase();
        personnelDeLaBaseAccessT = migrationDataBaseAccess(personnelDeLaBaseAccess);
    }

    private void verificationExisteDansLesAutresListe(CvTravailleur cvTravailleur) {
        if (personnelAffectationT.contains(cvTravailleur) && personnelMissionT.contains(cvTravailleur) && personnelPosteT.contains(cvTravailleur)) {
            personnelDeLaBaseAccessT.remove(cvTravailleur);
        }
    }

    public CvAffectation getAffecteMission() {
        return affecteMission;
    }

    public void setAffecteMission(CvAffectation affecteMission) {
        this.affecteMission = affecteMission;
    }

    public CvCompagnie getAffecteCompagnie() {
        return affecteCompagnie;
    }

    public void setAffecteCompagnie(CvCompagnie affecteCompagnie) {
        this.affecteCompagnie = affecteCompagnie;
    }

    public boolean isComplet() {
        return complet;
    }

    public void setComplet(boolean complet) {
        this.complet = complet;
    }

    public CvPosteoccupe getCvPosteoccupeNouveau() {
        return cvPosteoccupeNouveau;
    }

    public void setCvPosteoccupeNouveau(CvPosteoccupe cvPosteoccupeNouveau) {
        this.cvPosteoccupeNouveau = cvPosteoccupeNouveau;
    }

    public void nouvelleAffectionEquipe() {
        if (affecteMission.getCvEquipedepartementIdequipedepartement() != null) {
            for (CvTravailleur pers : personnelMissionT) {
                pers.setCvAffectationIdaffectation(affecteMission);
            }
        }
    }

    public void nouvelleAffectionCompagnie() {
        if (affecteCompagnie != null) {
            for (CvTravailleur pers : personnelAffectationT) {
                CvTravail cvTravail = new CvTravail();
                cvTravail.setIdcompagnie(affecteCompagnie);
                pers.setCvTravail(cvTravail);
            }
        }
    }

    public void nouvelleAffectionPoste() {
        if (cvPosteoccupeNouveau.getIdposteoccupe() != null) {
            for (CvTravailleur pers : personnelAffectationT) {
                pers.setCvPosteoccupeIdposteoccupe(cvPosteoccupeNouveau);
            }
        }
    }

    public void enregistrementGeneral() throws PreexistingEntityException, Exception {
        boolean fait = false;

        if (!personnelMissionT.isEmpty()) {
            for (CvTravailleur pers : personnelMissionT) {
                sontLesMeme2(pers);
            }
        }
        if (!personnelPosteT.isEmpty()) {
            for (CvTravailleur pers : personnelPosteT) {
                sontLesMeme1(pers);
            }
        }

        if (!personnelAffectationT.isEmpty()) {
            CvTravailleurJpaController cvTravailleurJpaController = new CvTravailleurJpaController();
            CvDocofficielsJpaController cvDocofficielsJpaController = new CvDocofficielsJpaController();
            CvTravailJpaController cvTravailJpaController = new CvTravailJpaController();
            CvTypedecontratJpaController typedecontratJpaController = new CvTypedecontratJpaController();
            CvTypedecontrat cvTypedecontrat = typedecontratJpaController.findCvTypedecontrat("CDI");

            for (CvTravailleur pers : personnelAffectationT) {
                CvTravailleur testCvTravailleur = new CvTravailleur();
                testCvTravailleur = cvTravailleurJpaController.findCvTravailleurByIdPersonnel(pers.getIDpersonne());

                if (testCvTravailleur.getId() == null) {

                    CvTravail cvTravail = new CvTravail();
                    cvTravail = pers.getCvTravail();
                    cvTravail.setTypecontrat(cvTypedecontrat);
                    pers.setCvTravail(null);
                    List<CvDocofficiels> listCvDocofficielses = pers.getCvDocofficielsList();
                    List<CvDocofficiels> tmp = new ArrayList<CvDocofficiels>();
                    pers.setCvDocofficielsList(null);
                    cvTravailleurJpaController.create(pers);
                    CvDocofficiels cvDocofficiels = new CvDocofficiels();
                    if (!listCvDocofficielses.isEmpty()) {
                        cvDocofficiels = listCvDocofficielses.get(0);
                        cvDocofficiels.setCvTravailleurId(pers);
                        cvDocofficielsJpaController.create(cvDocofficiels);
                        listCvDocofficielses = new ArrayList<CvDocofficiels>();
                        listCvDocofficielses.add(cvDocofficiels);
                        pers.setCvDocofficielsList(listCvDocofficielses);
                    }

                    cvTravail.setCvTravailleur(pers);
                    cvTravailJpaController.create(cvTravail);
                    pers.setCvTravail(cvTravail);
                    cvTravailleurJpaController.edit(pers);

                }
            }
            fait = true;
        }

        if (fait) {
            personnelMissionT = new ArrayList<CvTravailleur>();
            personnelPosteT = new ArrayList<CvTravailleur>();
            personnelAffectationT = new ArrayList<CvTravailleur>();
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Personnel Engeristrer", ""));
        } else {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erreur", ""));
        }
    }

    private void sontLesMeme2(CvTravailleur t1) {
        if (personnelAffectationT.contains(t1)) {
            int i = personnelAffectationT.indexOf(t1);
            personnelAffectationT.get(i).setCvPosteoccupeIdposteoccupe(t1.getCvPosteoccupeIdposteoccupe());
        } else {
            personnelAffectationT.add(t1);
        }
    }

    private void sontLesMeme1(CvTravailleur t1) {
        if (personnelAffectationT.contains(t1)) {
            int i = personnelAffectationT.indexOf(t1);
            personnelAffectationT.get(i).setCvTravail(t1.getCvTravail());
        } else {
            personnelAffectationT.add(t1);
        }
    }

}
